home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_04
/
9n04059a
< prev
next >
Wrap
Text File
|
1991-02-12
|
6KB
|
176 lines
/**********************************************************
An implementation of the point and shoot menu system.
The main function is a simple demonstration routine.
*/
#include <stdio.h>
#include <conio.h>
#define CRET 0x0d /* key definitions */
#define TAB 0x09
#define BACKTAB 0x0f /* key scan codes */
#define UPARROW 0x48
#define DNARROW 0x50
#define LTARROW 0x4b
#define RTARROW 0x4d
#define PAGEUP 0x49
#define PAGEDN 0x51
#define HOMEKEY 0x47
#define ENDKEY 0x4f
#define CTRLEND 0x75
/**********************************************************
display one line of menu at the proper location. If
an X offset is specified then this must be horizontal
formatted menu.
*/
void show (int x,int y,int xoff,int yoff,char *p,int fore)
{
if (xoff) /* if an X offset exist */
x += xoff;
else
y += yoff;
gotoxy(x,y);
textcolor(fore|8); /* use intense color */
putch(*p++); /* print the first char */
textcolor(fore); /* back to normal color */
cputs(p); /* print the rest of it */
}
/**********************************************************
search the p list for a beginning character in the
menu list that matches c.
*/
int findletter (char c, char *p[], int i)
{
int j = 0;
while (*p[j] != NULL) /* while not at end */
if (c == *p[j]) /* if we find a match */
{ i = j; break; } /* record and quit */
else
j++;
return(i); /* return the new idx */
}
/**********************************************************
initialize certain location variables to allow us
to write at proper screen location.
*/
int init (char *p[], int horz, int *xoff)
{
int max = 0, x = 0;
if (horz) /* if horizontal format */
{
while (p[max] != NULL) /* while not at end */
{
*xoff++ = x; /* calc X offsets */
x += strlen(p[max++]); /* add length of item */
}
}
else /* else zero it out */
{
while (p[max++] != NULL) *xoff++ = 0;
max--;
}
return(max); /* number of items found */
}
/**********************************************************
set the index according to user's response. returns
the new index value or -1 if the user pressed enter.
*/
int keypress (char *p[], char c, int i, int max)
{
int done = 0;
switch(c) /* switch on user input */
{
case UPARROW:
case LTARROW:
case BACKTAB: i--; break;
case DNARROW:
case RTARROW:
case TAB: i++; break;
case CRET: done = 1; break;
default: i = findletter(c,p,i);
}
if (done) i = -1; else /* if done, ret -1 */
if (i < 0) i = max-1; else /* else do range check */
if (i == max) i = 0;
return(i); /* ret new index */
}
/**********************************************************
display a point and shoot menu. Return the first
character of the menu option selected.
*/
char menu (char *p[], int horz)
#define MAX_ELEMENTS 12
{
struct text_info info; /* holds text screen info */
int i, j, x = 0, y, fore, back, max, savei;
int xoff[MAX_ELEMENTS]; /* for use w/ horiz format */
char c;
max = init(p,horz,xoff); /* calc screen positions */
gettextinfo(&info); /* get current screen attr */
fore = info.attribute & 0x0f;/* extract foreground color */
back = info.attribute >> 4; /* extract background color */
x = info.curx; /* establish reference location */
y = info.cury;
_setcursortype(_NOCURSOR); /* turn cursor off */
for (i=0; i<max; i++) /* display all menu items */
show(x,y,xoff[i],i,p[i],fore);
i = 0;
do
{
textcolor(back); /* set reverse video mode */
textbackground(fore);
show(x,y,xoff[i],i,p[i],back); /* display selected item */
if ((c = toupper(getch())) == 0)/* if 0 is returned */
c = getch(); /* then get scan code */
textcolor(fore); /* set normal video mode */
textbackground(back);
show(x,y,xoff[i],i,p[i],fore); /* redisplay item */
savei = i; /* save prev sel item */
}
while ((i = keypress(p,c,i,max)) != -1); /* quit when user selects */
_setcursortype(_NORMALCURSOR); /* turn cursor back on */
return(*p[savei]); /* return selection */
}
/**********************************************************
demonstration main function to show use of the point
and shoot menu.
*/
void main (void)
{
char *p[] = {"First ","Second ","Third ",
"Quit ",NULL}, c;
int format = 0;
textcolor(LIGHTGRAY);
textbackground(BLUE);
clrscr();
cputs("Display menu in horizontal format? (y/n) >");
if (toupper(getch()) == 'Y') format = 1;
gotoxy(10,10);
while ((c = menu(p,format)) != 'Q')
{
gotoxy(10,20);
cprintf("The selected option is : %c\n\r",c);
gotoxy(10,10);
}
}